﻿//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
// 프로그램 명		: frmFileUpDownLoad.cs
// 프로그램 기능	: 파일 업/다운로드 기능 제공 클래스
// 클래스 기능		: frmFileUpDownLoad 지원 클래스
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// 개발자			: 김승현, 조범준
// 개발일			: 2014-06-17
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// F/W 버전		    : Dot NET Compack Framework 4.0 Service Pack 1 Patch
// 라이센스			: Copyright ⓒ 2014-2014 All rights reserved.
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// 명명규칙			: 클래스(class) 명				- "c" + 클래스명
//					  전역(private) 상수			- "MC_" + 상수명
//					  공용(public)  상수			- "PC_" + 상수명
//					  전역(private) 변수/객체/핸들/구조체/컬렉션/델리게이트
//													- "mv_" + 타입/obj_/hwnd_/stru_/coll_/del_ + 명
//					  공용(public)  변수/객체/핸들/구조체/컬렉션/델리게이트/이벤트
//													- "pv_" + 타입/obj_/hwnd_/stru_/coll_/del_/evnt_ + 명
//					  공용(public)  속성(Property)	- "pp_" + 타입 + 속성명
//					  전역(private) 함수/API		- "mf_" + 함수명/API 함수명
//					  공용(public)  함수/API		- "pf_" + 함수명/API 함수명
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// 개발자는 개발/수정시 위의 내용을 반드시 작성하며 내용이 일치하지 않을때에는 모든 사항을 개발자가 책임 진다.
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
using System.IO;
using System.Net;
using System.Threading;
using System.Diagnostics;
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
namespace ComCls
{
	///▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
	/// <summary>frmMain 클래스</summary>
	///▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
	public partial class frmFileUpDownLoad : Form
	{
		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [생성자/소멸자]
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>생성자</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public frmFileUpDownLoad()
		{
			InitializeComponent();

			mf_Init(this);
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>소멸자</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		~frmFileUpDownLoad()
		{
			mf_UnInit(this);
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 상수/나열형 - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 상수명 첫 문자는 "MC_" 로 시작
		//         - 전체를 영문 대문자로 하고 상수명이 긴 경우 '_'로 구분해서 명명
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		///<summary>전역(private) 상수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private const string MC_HELLO = "Hello...";
		private enum ME_TYPE_HELLO { EMPTY, HELLO1, HELLO2 };
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 상수/나열형 - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 상수명 첫 문자는 "PC_" 로 시작
		//         - 전체를 영문 대문자로 하고 상수명이 긴 경우 '_'로 구분해서 명명
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		///<summary>공용(public) 상수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public const string PC_HELLO = "Hello...";
		public enum PE_TYPE_HELLO { EMPTY, HELLO1, HELLO2 };
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 변수/객체/핸들/구조체/컬렉션/델리게이트 - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "mv_타입"/"mv_obj"/"mv_hwnd"/"mv_struc"/"mv_coll"/"mv_del" 로 시작
		//         - 영문 대소문자로 시작하고 변수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>전역(private) 변수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private string mv_sHello = null;
		//---------------------------------------------------------------------------------------------------
		//전역(private) 변수 선언
		//---------------------------------------------------------------------------------------------------
		private WebClient webClient = null;																//파일 업/다운로드 객체
		private cFunction mv_oFunc = null;																//공용함수 인스턴스 핸들
		private DateTime mv_dtFileUpDownStartTime;														//파일 업/다운로드 시작시간(경과시간 계산용)
		private cConst.PE_FILE_UPDOWN_PROTOCOL mv_eProtocol = cConst.PE_FILE_UPDOWN_PROTOCOL.EMPTY;		//파일 업/다운로드 프로토콜
		private cConst.PE_FILE_UPDOWN_TYPE mv_eType = cConst.PE_FILE_UPDOWN_TYPE.EMPTY;					//파일 업/다운로드 프로토콜
		private string mv_sWebServerPath = null;														//업/다운로드 할 웹서버 경로(경로만)
		private string mv_sWebServerFileName = null;													//업/다운로드 할 웹서버 파일 명
		private string mv_sWebServerFileNameReName = null;												//업/다운로드 할 웹서버 변경할 파일 명
		private string mv_sFileNamePath = null;															//업/다운로드 할 파일 경로(경로만)
		private string mv_sFileName = null;																//업/다운로드 할 파일 명
		private string mv_sUserID = null;																//웹서버 사용자 계정
		private string mv_sPassword = null;																//웹서버 사용자 계정 비밀번호
		private bool mv_bAutoClose = false;																//업/다운로드 완료시 창 자동 닫기여부
		private long mv_nFtpDownFileSize = 0;															//FTP에서 파일 다운로드시 파일 크기를 미리구함
		//---------------------------------------------------------------------------------------------------
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 변수/객체/핸들/구조체/컬렉션/델리게이트/이벤트 - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "pv_타입"/"pv_obj"/"pv_hwnd"/"pv_struc"/"pv_coll"/"pv_del"/"pv_event" 로 시작
		//         - 영문 대소문자로 시작하고 변수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>공용(public) 변수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public string pv_sHello = null;
		//---------------------------------------------------------------------------------------------------
		//공용(public) 변수 선언
		//---------------------------------------------------------------------------------------------------
		public cConst.PE_FILE_UPDOWN_STATUS pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.EMPTY;			//파일 업/다운로드 상태
		public delegate void UpDownloadFileCompleted(object sender, cConst.pv_strucFileUpDownloadInfo strucFileUpDownloadInfo);
		public event UpDownloadFileCompleted OnUpDownloadFileCompleted;											//파일 업/다운로드 이벤트
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 속성(Property:읽기 쓰기 선택적 가능) - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "pp_타입" 로 시작
		//         - 영문 대소문자로 시작하고 속성명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>공용(public) 속성(Property) 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public string pp_bHello
		{
			get { return mv_sHello; }
			set { mv_sHello = value; }
		}
		//---------------------------------------------------------------------------------------------------
		//파일 업/다운로드 속성 정의
		//---------------------------------------------------------------------------------------------------
		//public cConst.PE_FILE_UPDOWN_PROTOCOL pp_eFileUpDownProtocol				//파일 업/다운로드 프로토콜 지정
		//{
		//    get { return mv_eFileUpDownProtocol; }
		//    set { mv_eFileUpDownProtocol = value; }
		//}
		//public cConst.PE_FILE_UPDOWN_TYPE pp_eFileUpDownType						//파일 업/다운로드 방법 지정
		//{
		//    get { return mv_eFileUpDownType; }
		//    set { mv_eFileUpDownType = value; }
		//}
		//public string pp_sFilenamePath												//업/다운로드 할 파일명
		//{
		//    get { return mv_sFileNamePath; }
		//    set { mv_sFileNamePath = value; }
		//}
		//public string pp_sPassword													//사용자 계정 비밀번호
		//{
		//    get { return mv_sPassword; }
		//    set { mv_sPassword = value; }
		//}
		//public string pp_sUserID													//사용자 계정
		//{
		//    get { return mv_sUserID; }
		//    set { mv_sUserID = value; }
		//}
		//public string pp_sWebServerPath												//업/다운로드할 웹서버 경로
		//{
		//    get { return mv_sWebServerPath; }
		//    set { mv_sWebServerPath = value; }
		//}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 함수/API - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "mf_" + 함수명 또는 API 함수명 으로 시작
		//         - 영문 대소문자로 시작하고 함수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>전역(private) 함수 선언 예</summary>
		/// <param name="sStr">전역(private) 함수 인자 선언 예</param>
		/// <returns>string</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private string mf_Hello(string sStr)
		{
			try
			{
				sStr = "Hello...";
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return sStr;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>클래스 초기화</summary>
		/// <param name="objClass">클래스 객체 인스턴스</param>
		/// <returns>void</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private void mf_Init(frmFileUpDownLoad objClass)
		{
			try
			{
				//클래스 초기화
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>클래스 마무리</summary>
		/// <param name="objClass">클래스 객체 인스턴스</param>
		/// <returns>void</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private void mf_UnInit(frmFileUpDownLoad objClass)
		{
			try
			{
				//클래스 마무리
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드 폼의 버튼을 상황에 맞게 셋팅</summary>
		/// <returns>void</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private void mf_SetButtons()
		{
			try
			{
				switch (this.pv_eFileUpDownStatus)
				{
					case cConst.PE_FILE_UPDOWN_STATUS.INIT:
						//파일 업/다운로드 시작 버튼
						this.btnStart.Enabled = true;
						this.btnStart.Visible = true;

						//파일 업/다운로드 완료 버튼
						this.btnComplete.Enabled = false;
						this.btnComplete.Visible = false;

						//파일 업/다운로드 취소 버튼
						this.btnCancel.Enabled = true;
						this.btnCancel.Visible = true;

						break;
					case cConst.PE_FILE_UPDOWN_STATUS.ING:
						//파일 업/다운로드 시작 버튼
						this.btnStart.Enabled = false;
						this.btnStart.Visible = true;

						//파일 업/다운로드 완료 버튼
						this.btnComplete.Enabled = false;
						this.btnComplete.Visible = false;

						//파일 업/다운로드 취소 버튼
						this.btnCancel.Enabled = true;
						this.btnCancel.Visible = true;

						break;
					case cConst.PE_FILE_UPDOWN_STATUS.COMPLETE:
						//파일 업/다운로드 시작 버튼
						this.btnStart.Enabled = false;
						this.btnStart.Visible = false;

						//파일 업/다운로드 완료 버튼
						this.btnComplete.Enabled = true;
						this.btnComplete.Visible = true;

						//파일 업/다운로드 취소 버튼
						this.btnCancel.Enabled = false;
						this.btnCancel.Visible = false;

						//파일 업/다운로드 창 자동닫기 확인
						if (this.mv_bAutoClose == true)
						{
							this.Close();
						}

						break;
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 함수(Method)/API - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "pf_" + 함수명 또는 API 함수명 으로 시작
		//         - 영문 대소문자로 시작하고 함수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>공용(public) 함수(Method) 선언 예</summary>
		/// <param name="sStr">공용(public) 함수(Method) 인자 선언 예</param>
		/// <returns>string</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		public string pf_Hello(string sStr)
		{
			try
			{
				sStr = "Hello...";
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return sStr;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드를 하기위해 초기화</summary>
		/// <param name="eProtocol">파일 업/다운로드 프로토콜(HTTP/FTP)</param>
		/// <param name="eType">파일 업/다운로드 방법</param>
		/// <param name="sWebServerPath">파일 업/다운로드할 서버 경로</param>
		/// <param name="sWebServerFileNameReName">파일 업/다운로드할 변경할 파일명</param>
		/// <param name="sFileNamePath">파일 업/다운로드할 로컬 파일 경로</param>
		/// <param name="sUserID">사용자 계정(FTP인 경우만)</param>
		/// <param name="sPassword">사용자 계정 비밀번호(FTP인 경우만)</param>
		/// <param name="bAutoClose">파일 업/다운로드 완료시 창 자동닫기 여부</param>
		/// <returns>bool</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		public bool pf_Init(ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL eProtocol, ComCls.cConst.PE_FILE_UPDOWN_TYPE eType, string sWebServerPath, string sWebServerFileNameReName, string sFileNamePath, string sUserID, string sPassword, bool bAutoClose)
		{
			bool bResult = true;
			int nIndex = -1;
			string sServerPath = null;

			try
			{
				//---------------------------------------------------------------------------------------------------
				//필요 속성값 확인
				//---------------------------------------------------------------------------------------------------
				if (eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.EMPTY || eType == cConst.PE_FILE_UPDOWN_TYPE.EMPTY || sWebServerPath == null || sFileNamePath == null)
				{
					bResult = false;
				}
				else
				{
					if (this.mv_eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.FTP)
					{
						if (mv_sUserID == null || mv_sPassword == null)
						{
							bResult = false;
						}
					}

					if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.UPLOAD)
					{
						if (sWebServerFileNameReName == null) bResult = false;
					}
				}
				//---------------------------------------------------------------------------------------------------
				//초기화
				//---------------------------------------------------------------------------------------------------
				if (bResult == true)
				{
					//전역변수 초기화
					this.mv_eProtocol = eProtocol;
					this.mv_eType = eType;
					this.mv_sWebServerPath = sWebServerPath;
					this.mv_sWebServerFileNameReName = sWebServerFileNameReName;
					this.mv_sFileNamePath = sFileNamePath;
					this.mv_bAutoClose = bAutoClose;

					if (this.mv_sUserID == null && this.mv_sPassword == null)
					{
						this.mv_sUserID = sUserID;
						this.mv_sPassword = sPassword;
					}

					//파일 업/다운로드 방법
					if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.UPLOAD) this.Text = "파일 업로드";
					else this.Text = "파일 다운로드";

					//파일 업/다운로드 프로토콜
					//if (this.mv_eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.HTTP) this.Text += " [HTTP]";
					//else this.Text += " [FTP]";

					//파일 업/다운로드 웹 서버
					nIndex = this.mv_sWebServerPath.LastIndexOf('/');

					if (nIndex != -1) this.mv_sWebServerFileName = this.mv_sWebServerPath.Substring(nIndex + 1, this.mv_sWebServerPath.Length - nIndex - 1);
					else this.mv_sWebServerFileName = this.mv_sWebServerPath;

					this.mv_sWebServerPath = this.mv_sWebServerPath.Replace(this.mv_sWebServerFileName, "");

					sServerPath = this.mv_sWebServerPath.Replace("http://", "").Replace("ftp://", "");

					nIndex = sServerPath.IndexOf(':');

					if (nIndex == -1) nIndex = sServerPath.IndexOf('/');
					if (nIndex != -1) sServerPath = sServerPath.Substring(0, nIndex);

					this.lblWebServerPath.Text = "서버경로 : " + sServerPath;

					if (this.lblWebServerPath.Width > this.pBarUpDownPercentBottom.Width - 10)
					{
						this.lblWebServerPath.Text = string.Format("{0}...", this.lblWebServerPath.Text.Substring(0, 50));
					}

					//파일 업/다운로드 파일명
					nIndex = this.mv_sFileNamePath.LastIndexOf('\\');

					if (nIndex != -1) this.mv_sFileName = this.mv_sFileNamePath.Substring(nIndex + 1, this.mv_sFileNamePath.Length - nIndex - 1);
					else this.mv_sFileName = this.mv_sFileNamePath;

					this.mv_sFileNamePath = this.mv_sFileNamePath.Replace(this.mv_sFileName, "");

					this.lblFileNamePath.Text = "파일경로 : " + this.mv_sFileName;

					if (this.lblFileNamePath.Width > this.pBarUpDownPercentBottom.Width - 10)
					{
						this.lblFileNamePath.Text = string.Format("{0}...", this.lblFileNamePath.Text.Substring(0, 50));
					}

					//파일 업/다운로드 상태
					if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.UPLOAD) this.lblUpDownStatus.Text = "업로드 상태 (0%) : ";
					else this.lblUpDownStatus.Text = "다운로드 상태 (0%) : ";

					//파일 업/다운로드 경과시간
					this.lblElapsedTime.Text = "경과시간 : 00:00:00";

					//파일 업/다운로드 속도
					this.lblUpDownSpeed.Text = "속도 : 0 kb/sec";

					//파일 업/다운로드 폼 버튼 초기화
					this.pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.INIT;
					this.mf_SetButtons();

					//파일 업/다운로드 객체 초기화
					this.webClient = new WebClient();

					if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.UPLOAD)
					{
						this.webClient.Headers.Add("UserAgent", "UpLoadFile");

						this.webClient.UploadFileCompleted += new UploadFileCompletedEventHandler(webClient_UploadFileCompleted);
						this.webClient.UploadProgressChanged += new UploadProgressChangedEventHandler(webClient_UploadProgressChanged);
					}
					else if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.DOWNLOAD)
					{
						this.webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
						this.webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
					}
				}
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return bResult;
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 시스템 이벤트함수 - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 없음!
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>폼 로드 될 때 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void frmFileUpDownLoad_Load(object sender, System.EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//공용함수 인스턴스 생성
				//---------------------------------------------------------------------------------------------------
				this.mv_oFunc = new ComCls.cFunction(this);
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>폼 언로드 될 때 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void frmFileUpDownLoad_FormClosing(object sender, FormClosingEventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//파일 업/다운로드 타이머 정지
				//---------------------------------------------------------------------------------------------------
				this.timerUpDownTime.Stop();
				this.timerUpDownTime.Enabled = false;
				//---------------------------------------------------------------------------------------------------
				if (this.webClient != null) this.webClient.Dispose();

				this.webClient = null;
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>폼 언로드 되고 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void frmFileUpDownLoad_FormClosed(object sender, FormClosedEventArgs e)
		{
			try
			{

			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드 시작버튼 클릭하면 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnStart_Click(object sender, EventArgs e)
		{
			string sProtocol = null;
			bool bFileExistOK = true;
			bool bFileSizeOK = true;

			try
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.INIT ||
					this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					//---------------------------------------------------------------------------------------------------
					//파일 업/다운로드 프로토콜 구분
					//---------------------------------------------------------------------------------------------------
					if (this.mv_eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.HTTP)
					{
						sProtocol = "POST";
					}
					else if (this.mv_eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.FTP)
					{
						sProtocol = "STOR";
						this.webClient.Credentials = new NetworkCredential(this.mv_sUserID, this.mv_sPassword);
					}
					//---------------------------------------------------------------------------------------------------
					//파일 업/다운로드 가능여부 확인
					//---------------------------------------------------------------------------------------------------
					if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.UPLOAD)
					{
						bFileExistOK = false;

						if (this.mv_sFileNamePath != null && this.mv_sFileName != null)
						{
							bFileExistOK = File.Exists(this.mv_sFileNamePath + this.mv_sFileName);
						}
					}
					else if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.DOWNLOAD)
					{
						bFileSizeOK = false;

						//FTP-DOWNLOAD 인 경우 파일 크기를 미리 구해둔다(Ftp 서버는 파일 크기를 반환하지 않으므로)
						if (this.mv_eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.FTP && this.mv_sWebServerPath != null && this.mv_sWebServerFileName != null)
						{
							bFileSizeOK = this.mv_oFunc.pf_FtpGetFileSize(this.mv_sWebServerPath + this.mv_sWebServerFileName, this.mv_sUserID, this.mv_sPassword, ref this.mv_nFtpDownFileSize);
						}
					}
					//---------------------------------------------------------------------------------------------------
					//파일 업/다운로드 시작
					//---------------------------------------------------------------------------------------------------
					if (bFileExistOK == true && bFileSizeOK == true)
					{
						//---------------------------------------------------------------------------------------------------
						//파일 업/다운로드 시작 상태 지정
						//---------------------------------------------------------------------------------------------------
						this.UseWaitCursor = true;
						this.pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.ING;
						this.mf_SetButtons();
						//---------------------------------------------------------------------------------------------------
						//파일 업/다운로드 타이머 시작
						//---------------------------------------------------------------------------------------------------
						this.timerUpDownTime.Interval = 100;
						this.timerUpDownTime.Enabled = true;
						this.timerUpDownTime.Start();

						this.mv_dtFileUpDownStartTime = DateTime.Now;
						//---------------------------------------------------------------------------------------------------
						if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.UPLOAD)
						{
							this.webClient.UploadFileAsync(new Uri(this.mv_sWebServerPath + this.mv_sWebServerFileNameReName), sProtocol, this.mv_sFileNamePath + this.mv_sFileName, null);
						}
						else if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.DOWNLOAD)
						{
							this.webClient.DownloadFileAsync(new Uri(this.mv_sWebServerPath + this.mv_sWebServerFileName), this.mv_sFileNamePath + this.mv_sFileName);
						}
						//---------------------------------------------------------------------------------------------------
					}
					//---------------------------------------------------------------------------------------------------
					//오류 처리
					//---------------------------------------------------------------------------------------------------
					if (bFileExistOK == false)
					{
						MessageBox.Show(ComCls.cConst.PC_ERROR_FILE_UPLOAD_NOTFOUND, ComCls.cConst.PC_ERROR_FILE_UPLOAD_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
					}

					if (bFileSizeOK == false)
					{
						MessageBox.Show(ComCls.cConst.PC_ERROR_FILE_DOWNLOAD_NOTFOUND, ComCls.cConst.PC_ERROR_FILE_DOWNLOAD_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
					}
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드 완료버튼 클릭하면 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnComplete_Click(object sender, EventArgs e)
		{
			try
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.COMPLETE)
				{
					//---------------------------------------------------------------------------------------------------
					//폼 닫기
					//---------------------------------------------------------------------------------------------------
					this.Close();
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드 취소버튼 클릭하면 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnCancel_Click(object sender, EventArgs e)
		{
			cConst.pv_strucFileUpDownloadInfo strucFileUpDownloadInfo;

			try
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					//---------------------------------------------------------------------------------------------------
					//파일 업/다운로드 취소
					//---------------------------------------------------------------------------------------------------
					this.webClient.CancelAsync();

					Thread.Sleep(300);
					//---------------------------------------------------------------------------------------------------
					//파일 업로드 취소
					//---------------------------------------------------------------------------------------------------
					if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.UPLOAD)
					{
						if (this.mv_eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.HTTP)
						{
							this.webClient.Headers.Clear();
							this.webClient.Headers.Add("UserAgent", "DeleteFile");
							this.btnStart_Click(sender, e);
						}
						else if (this.mv_eProtocol == cConst.PE_FILE_UPDOWN_PROTOCOL.FTP)
						{
							this.mv_oFunc.pf_FtpDeleteFile(this.mv_sWebServerPath, this.mv_sUserID, this.mv_sPassword);
						}
					}
					//---------------------------------------------------------------------------------------------------
					//파일 다운로드 취소
					//---------------------------------------------------------------------------------------------------
					else if (this.mv_eType == cConst.PE_FILE_UPDOWN_TYPE.DOWNLOAD)
					{
						if (File.Exists(this.mv_sFileNamePath) == true)
						{
							File.Delete(this.mv_sFileNamePath);
						}
					}
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				//---------------------------------------------------------------------------------------------------
				//파일 업/다운로드 타이머 정지
				//---------------------------------------------------------------------------------------------------
				this.UseWaitCursor = false;
				this.timerUpDownTime.Stop();
				this.timerUpDownTime.Enabled = false;
				//---------------------------------------------------------------------------------------------------
				//파일 업/다운로드 취소 이벤트 발생
				//---------------------------------------------------------------------------------------------------
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					this.pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.CANCEL;

					strucFileUpDownloadInfo.eProtocol = this.mv_eProtocol;
					strucFileUpDownloadInfo.eType = this.mv_eType;
					strucFileUpDownloadInfo.eStatus = this.pv_eFileUpDownStatus;
					strucFileUpDownloadInfo.sWebServerPath = this.mv_sWebServerPath;
					strucFileUpDownloadInfo.sWebServerFileName = this.mv_sWebServerFileName;
					strucFileUpDownloadInfo.sWebServerFileNameReName = this.mv_sWebServerFileNameReName;
					strucFileUpDownloadInfo.sFileNamePath = this.mv_sFileNamePath;
					strucFileUpDownloadInfo.sFileName = this.mv_sFileName;

					this.OnUpDownloadFileCompleted(sender, strucFileUpDownloadInfo);
				}
				//---------------------------------------------------------------------------------------------------
				//폼 닫기
				//---------------------------------------------------------------------------------------------------
				this.Close();
				//---------------------------------------------------------------------------------------------------
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드 취소버튼에서 마우스 움직이면 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnCancel_MouseMove(object sender, MouseEventArgs e)
		{
			try
			{
				this.UseWaitCursor = false;
			}
			catch (Exception ex)
			{
				this.UseWaitCursor = false;

				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드 취소버튼에서 마우스 벗어나면 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnCancel_MouseLeave(object sender, EventArgs e)
		{
			try
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					this.UseWaitCursor = true;
				}
				else
				{
					this.UseWaitCursor = false;
				}
			}
			catch (Exception ex)
			{
				this.UseWaitCursor = false;

				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드하는 동안 타이머 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void timerUpDownTime_Tick(object sender, EventArgs e)
		{
			try
			{
				this.lblElapsedTime.Text = string.Format("경과시간 : {0}", DateTime.Now - this.mv_dtFileUpDownStartTime);
			}
			catch { }
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일이 다운로드 완료되면 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
		{
			cConst.pv_strucFileUpDownloadInfo strucFileUpDownloadInfo;

			try
			{
				if (e.Cancelled == false && e.Error == null && this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					//---------------------------------------------------------------------------------------------------
					//파일 다운로드 완료 상태 지정
					//---------------------------------------------------------------------------------------------------
					this.pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.COMPLETE;
					this.mf_SetButtons();
					//---------------------------------------------------------------------------------------------------
				}
				else if (e.Cancelled == false && e.Error != null)
				{
					//---------------------------------------------------------------------------------------------------
					//에러 발생시 처리
					//---------------------------------------------------------------------------------------------------
					ComCls.cException.ExceptionMessageBox(e.Error, this);

					this.pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.ERROR;
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.COMPLETE ||
					this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ERROR)
				{
					//---------------------------------------------------------------------------------------------------
					//파일 업/다운로드 타이머 정지
					//---------------------------------------------------------------------------------------------------
					this.UseWaitCursor = false;
					this.timerUpDownTime.Stop();
					this.timerUpDownTime.Enabled = false;
					//---------------------------------------------------------------------------------------------------
					//파일 다운로드 완료 이벤트 발생
					//---------------------------------------------------------------------------------------------------
					strucFileUpDownloadInfo.eProtocol = this.mv_eProtocol;
					strucFileUpDownloadInfo.eType = this.mv_eType;
					strucFileUpDownloadInfo.eStatus = this.pv_eFileUpDownStatus;
					strucFileUpDownloadInfo.sWebServerPath = this.mv_sWebServerPath;
					strucFileUpDownloadInfo.sWebServerFileName = this.mv_sWebServerFileName;
					strucFileUpDownloadInfo.sWebServerFileNameReName = this.mv_sWebServerFileNameReName;
					strucFileUpDownloadInfo.sFileNamePath = this.mv_sFileNamePath;
					strucFileUpDownloadInfo.sFileName = this.mv_sFileName;

					this.OnUpDownloadFileCompleted(sender, strucFileUpDownloadInfo);
					//---------------------------------------------------------------------------------------------------
				}
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일이 다운로드 되는동안 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
		{
			int nPercent = 0;

			try
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.INIT ||
					this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					if (e.TotalBytesToReceive != -1)
					{
						nPercent = (int)((double)e.BytesReceived / (double)e.TotalBytesToReceive * 100.0);

						this.lblUpDownStatus.Text = string.Format("다운로드 상태 ({0}%) : {1}/{2} (Mbytes/Total)",
																	nPercent,
																	e.BytesReceived / 1048576,
																	e.TotalBytesToReceive / 1048576);

						this.lblUpDownSpeed.Text = string.Format("속도(Down) : {0} Mb/sec", Convert.ToUInt32(e.BytesReceived / 1048576 / (DateTime.Now - this.mv_dtFileUpDownStartTime).TotalSeconds));

						//this.pBarUpDownPercent.Value = e.ProgressPercentage;
						this.pBarUpDownPercentTop.Maximum = (int)e.TotalBytesToReceive;
						this.pBarUpDownPercentTop.Value = (int)e.BytesReceived;

						this.pBarUpDownPercentBottom.Maximum = (int)e.TotalBytesToReceive;
						this.pBarUpDownPercentBottom.Value = (int)e.BytesReceived;
					}
					else
					{
						if (this.mv_nFtpDownFileSize > 0)
						{
							nPercent = (int)((double)e.BytesReceived / (double)this.mv_nFtpDownFileSize * 100.0);

							this.lblUpDownStatus.Text = string.Format("다운로드 상태 ({0}%) : {1}/{2} (Mbytes/Total Mbytes)",
																		nPercent,
																		e.BytesReceived / 1048576,
																		this.mv_nFtpDownFileSize / 1048576);

							this.lblUpDownSpeed.Text = string.Format("속도(Down) : {0} Mb/Sec", Convert.ToUInt32(e.BytesReceived / 1048576 / (DateTime.Now - this.mv_dtFileUpDownStartTime).TotalSeconds));

							//this.pBarUpDownPercent.Value = nPercent;
							this.pBarUpDownPercentTop.Maximum = (int)this.mv_nFtpDownFileSize;
							this.pBarUpDownPercentTop.Value = (int)e.BytesReceived;

							this.pBarUpDownPercentBottom.Maximum = (int)this.mv_nFtpDownFileSize;
							this.pBarUpDownPercentBottom.Value = (int)e.BytesReceived;
						}
					}
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일이 업 완료되면 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void webClient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
		{
			cConst.pv_strucFileUpDownloadInfo strucFileUpDownloadInfo;
			
			try
			{
				if (e.Cancelled == false && e.Error == null && this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					//---------------------------------------------------------------------------------------------------
					//파일 업로드 완료 상태 지정
					//---------------------------------------------------------------------------------------------------
					this.pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.COMPLETE;
					this.mf_SetButtons();
					//---------------------------------------------------------------------------------------------------
				}
				else if (e.Cancelled == false && e.Error != null)
				{
					//---------------------------------------------------------------------------------------------------
					//에러 발생시 처리
					//---------------------------------------------------------------------------------------------------
					ComCls.cException.ExceptionMessageBox(e.Error, this);

					this.pv_eFileUpDownStatus = cConst.PE_FILE_UPDOWN_STATUS.ERROR;
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.COMPLETE ||
					this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ERROR)
				{
					//---------------------------------------------------------------------------------------------------
					//파일 업/다운로드 타이머 정지
					//---------------------------------------------------------------------------------------------------
					this.UseWaitCursor = false;
					this.timerUpDownTime.Stop();
					this.timerUpDownTime.Enabled = false;
					//---------------------------------------------------------------------------------------------------
					//파일 업로드 완료 이벤트 발생
					//---------------------------------------------------------------------------------------------------
					strucFileUpDownloadInfo.eProtocol = this.mv_eProtocol;
					strucFileUpDownloadInfo.eType = this.mv_eType;
					strucFileUpDownloadInfo.eStatus = this.pv_eFileUpDownStatus;
					strucFileUpDownloadInfo.sWebServerPath = this.mv_sWebServerPath;
					strucFileUpDownloadInfo.sWebServerFileName = this.mv_sWebServerFileName;
					strucFileUpDownloadInfo.sWebServerFileNameReName = this.mv_sWebServerFileNameReName;
					strucFileUpDownloadInfo.sFileNamePath = this.mv_sFileNamePath;
					strucFileUpDownloadInfo.sFileName = this.mv_sFileName;

					this.OnUpDownloadFileCompleted(sender, strucFileUpDownloadInfo);
					//---------------------------------------------------------------------------------------------------
				}
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일이 업운로드 되는동안 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void webClient_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
		{
			int nPercent = 0;

			try
			{
				if (this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.INIT ||
					this.pv_eFileUpDownStatus == cConst.PE_FILE_UPDOWN_STATUS.ING)
				{
					if (e.TotalBytesToSend != -1)
					{
						nPercent = (int)((double)e.BytesSent / (double)e.TotalBytesToSend * 100.0);

						this.lblUpDownStatus.Text = string.Format("업로드 상태 ({0}%) : {1}/{2} (Mbytes/Total Mbytes)",
																	nPercent,
																	e.BytesSent / 1048576,
																	e.TotalBytesToSend / 1048576);

						this.lblUpDownSpeed.Text = string.Format("속도(Up) : {0} Mb/Sec", Convert.ToUInt32(e.BytesSent / 1048576 / (DateTime.Now - this.mv_dtFileUpDownStartTime).TotalSeconds));

						this.pBarUpDownPercentTop.Maximum = (int)e.TotalBytesToSend;
						this.pBarUpDownPercentTop.Value = (int)e.BytesSent;

						this.pBarUpDownPercentBottom.Maximum = (int)e.TotalBytesToSend;
						this.pBarUpDownPercentBottom.Value = (int)e.BytesSent;
					}
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
	}// End class frmFileUpDownLoad
}// End namespace ComCls
